﻿'''
45 跳跃游戏II 贪心
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说，如果你在 nums[i] 处，你可以跳转到任意 nums[i + j] 处:
0 <= j <= nums[i] 
i + j < n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
示例 1:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置，跳 1 步，然后跳 3 步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4]
输出: 2
提示:
1 <= nums.length <= 104
0 <= nums[i] <= 1000
题目保证可以到达 nums[n-1]
'''
class Solution(object):
    def jump(self, nums: list[int]) -> int:
        steps = 0
        len_nums = len(nums)
        cur_distance = 0
        next_distance = 0
        for i in range(len_nums):
            next_distance = max(i + nums[i], next_distance)
            if i == cur_distance:       #走到当前最大覆盖范围
                if cur_distance != len_nums - 1:    #当前最大覆盖范围未到终点，步数+1，更新当前最大覆盖范围
                    steps += 1
                    cur_distance = next_distance
                    if next_distance >= len_nums - 1:   #下一步覆盖终点
                        break
        return steps
#示例
if __name__ == '__main__':
    nums = [2,3,1,1,4]
    nums1 = [2,3,0,1,4]
    nums2 = [2,2,0,1,4]
    print(Solution().jump(nums))
    print(Solution().jump(nums1))
    print(Solution().jump(nums2))

